/*******************************************************************************
 * This file is part of blueprint4j www.blueprint4j.org.
 * 
 *     blueprint4j is free software: you can redistribute it and/or modify
 *     it under the terms of the GNU Lesser General Public License as published by
 *     the Free Software Foundation, either version 3 of the License, or
 *     (at your option) any later version.
 * 
 *     blueprint4j is distributed in the hope that it will be useful,
 *     but WITHOUT ANY WARRANTY; without even the implied warranty of
 *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *     GNU Lesser General Public License for more details.
 * 
 *     You should have received a copy of the GNU Lesser General Public License
 *     along with blueprint4j. If not, see <http://www.gnu.org/licenses/>.
 ******************************************************************************/
package blueprint4j.db;

import java.sql.ResultSet;
import java.sql.SQLException;

import blueprint4j.utils.BindStringInterface;
import blueprint4j.utils.Log;

public class FieldString extends Field implements BindStringInterface {

	/**
	 * public Field( String p_name, String p_description, boolean p_key_field
	 * 
	 * Name: Name of field -> equivalent to table.field_name Description:
	 * Description of field key_field: Is this field a key field in the table
	 * (index field)
	 */
	private int length = 0;

	public FieldString(String p_name, int p_field_type, String p_description,int length, Entity entity) {
		super(p_name, p_field_type, p_description, entity);
		this.length = length;
	}

	public Field newInstance(Entity entity) {
		return new FieldString(getName(), getFieldType(), getDescription(),
				getLength(), entity);
	}

	public int getLength() {
		return length;
	}

	public void setObject(Object value) {
		if (super.getObject() == null
				|| ((String) super.getObject()).length() == 0) {
			if (value != null && ((String) value).length() > 0) {
				super.setObject(value);
			}
		} else {
			if (value != null && ((String) value).length() == 0) {
				super.setObject(null);
			} else {
				super.setObject(value);
			}
		}
	}

	protected void setFieldValue(ResultSet result_set) throws DataException {
		try {
			setObject(result_set.getString(getName()));
		} catch (SQLException se) {
			throw new DataException("Can not retrieve '" + getName() + "'");
		}
	}

	public String get() {
		return (String) getObject();
	}

	public void set(String value) {
		if (length>0 && value!=null && length<value.length()){
			Log.debug.out("Field["+getName()+"] set too long.");
		}
		setObject(value);
	}

	public String getAsString() {
		return get();
	}

	public void setAsString(String value) {
		set(value);
	}

	public boolean isNull() {
		return get() == null || get().length() == 0;
	}

	/**
	 * Return data in a suitable SQL format
	 */
	public String getSQLValue() throws DataException {
		if (get() == null) {
			return "null";
		}
		return entity.getConnection().getDataBaseUtils().convertStringForSQL(
				get());
	}

	public String toString() {
		if (getObject() == null) {
			return null;
		}
		return getObject().toString();
	}

	public void setSerializable(String p_value) {
		if ("null".equalsIgnoreCase(p_value)) {
			setObject(null);
		} else {
			setObject(p_value);
		}
	}

	/**
	 * An overloaded equals method that only accepts the correct type
	 */
	public boolean equals(String value) {
		return get().equals(value);
	}

	public Object getPreparedStatementObject() throws DataException {
		return getObject();
	}

}
